<?php
/**
 * Event 事件机制
 */
namespace soa\orders\v1\realname;

class Event 
{ 
    protected static $listens       = array(); 
     
    /**
     *  时间监听器
     * @param type $event
     * @param type $callback
     * @param type $once
     * @return boolean
     */
    public static function listen($event, $callback, $once=false){ 
        if(!is_callable($callback)) return false; 
         $args= func_get_args();
         unset($args[0]);
         unset($args[1]);
         unset($args[2]);
        self::$listens[$event][]    = array('callback'=>$callback, 'once'=>$once,'args'=>$args); 
        return true; 
    } 
    
    /**
     * 添加一个一次性执行的事件
     * @param type $event
     * @param type $callback
     * @return type
     */
    public static function one($event, $callback){ 
        return self::listen($event, $callback, true); 
    } 
    /**
     * 移除一个事件
     * @param type $event
     * @param type $index
     */  
    public static function remove($event, $index=null){ 
        if(is_null($index)) 
            unset(self::$listens[$event]); 
        else
            unset(self::$listens[$event][$index]); 
    } 
      
    /**
     * 事件触发器
     * @return boolean
     */
    public static function trigger(){ 
        if(!func_num_args()) return false; 
        $args                       = func_get_args(); 
        $event                      = array_shift($args); 
        if(!isset(self::$listens[$event])) return false; 
        $r = array();
        foreach((array) self::$listens[$event] as $index=>$listen){ 
            $callback               = $listen['callback']; 
            $listen['once'] && self::remove($event, $index);
            $args = array_merge($listen['args'],$args);
            $r[] = call_user_func_array($callback, $args); 
        }
        return $r;
    }  
}
